package com.jcj.monitorevent;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 通用 handler,处理I/O事件
 *
 * @ChannelHandler.Sharable :表示该Handler类是线程安全的
 */
@ChannelHandler.Sharable
public class HandlerClientMonitorEvent extends SimpleChannelInboundHandler<ByteBuf> {

    /**
     * 处理接收到的消息
     *
     * @param channelHandlerContext 通道的上下文
     * @param byteBuf               字节序列
     */
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
        System.out.println("接收到的消息: " + byteBuf.toString(CharsetUtil.UTF_8));
    }

    /**
     * 处理I/O事件的异常
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();//关闭当前Channel的连接
    }

    /**
     * 建立连接后该channelActive()方法只会被调用一次,这里的逻辑:建立连接后,字节序列被发送到服务器,编码格式是utf-8
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss SSS");//设置日期格式
        String strDate = df.format(new Date());
        ctx.writeAndFlush(Unpooled.copiedBuffer("这是客户端通过Active方法发送的消息 " + strDate + "\r\n", CharsetUtil.UTF_8));
    }

    /**
     * 通道处于非活动状态触发的动作,该方法只会在通道失效时调用一次
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        System.out.println("服务器端掉线");
    }
}





















